package persistencia;

import bitclub.Pelicula;
import bitclub.Proveedor;
import bitclub.Tarifa;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Bit Company
 */
public class PPelicula {

    /**
     * Introduce un nuevo objeto Pelicula en la base de datos 
     */
    public static void nuevoBD(Pelicula pelicula) {
        Connection conexion = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {
            //Establecemos la conexión
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = conexion.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateFechaAlta = pelicula.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            Date dateFechaBaja = pelicula.getFechaBaja();
            String stringFechaBaja;
            if (dateFechaBaja == null) {
                stringFechaBaja = "null";
            } else {
                stringFechaBaja = "'" + dateFormat.format(dateFechaAlta) + "'";
            }

            Tarifa tarifa = pelicula.getTarifa();
            String stringTarifa;
            stringTarifa = Integer.toString(tarifa.getId());

            Proveedor proveedor = pelicula.getProveedor();
            String stringProveedor;
            if (proveedor == null) {
                stringProveedor = "-1";
            } else {
                stringProveedor = Integer.toString(proveedor.getId());
            }

            int disponible = pelicula.isDisponible() ? 1 : 0;
            int activo = pelicula.isActivo() ? 1 : 0;

            //Pasamos la cadena del INSERT a la base de datos

            statement.executeUpdate("INSERT INTO ARTICULOS (ISPELICULA, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO,"
                    + " INTERPRETES, NACIONALIDAD, FECHA_ALTA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, FECHA_BAJA, DISPONIBLE, ACTIVO) "
                    + "VALUES (1, '" + pelicula.getTitulo() + "', '" + pelicula.getGenero() + "', " + pelicula.getAno()
                    + ", " + pelicula.getClasificacionEdad() + ", " + pelicula.getDuracion() + ", '" + pelicula.getFormato()
                    + "', '" + pelicula.getInterpretes() + "', '" + pelicula.getNacionalidad() + "', '" + stringFechaAlta
                    + "'," + stringTarifa + ", " + stringProveedor + ", " + pelicula.getVecesAlquilada() + ", " + stringFechaBaja
                    + ", " + disponible + ", " + activo + ")");

            resultSet = statement.executeQuery("SELECT ID FROM ARTICULOS ORDER BY ID DESC");
            if (resultSet.next()) {
                pelicula.setId(resultSet.getInt("id"));
            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                conexion.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }

    }

    /**
     * Actualiza un objeto Pelicula en la base de datos 
     */
    public static void actualizarBD(Pelicula pelicula) {
        Connection conexion = null;
        Statement statement = null;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {
            //Establecemos la conexión
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = conexion.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateFechaAlta = pelicula.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            Date dateFechaBaja = pelicula.getFechaBaja();
            String stringFechaBaja;
            if (dateFechaBaja == null) {
                stringFechaBaja = "null";
            } else {
                stringFechaBaja = "'" + dateFormat.format(dateFechaAlta) + "'";
            }

            Tarifa tarifa = pelicula.getTarifa();
            String stringTarifa;
            stringTarifa = Integer.toString(tarifa.getId());
            
            Proveedor proveedor = pelicula.getProveedor();
            String stringProveedor;
            if (proveedor == null) {
                stringProveedor = "-1";
            } else {
                stringProveedor = Integer.toString(proveedor.getId());
            }

            int disponible = pelicula.isDisponible() ? 1 : 0;
            int activo = pelicula.isActivo() ? 1 : 0;

            //Pasamos la cadena del UPDATE a la base de datos

            statement.executeUpdate("UPDATE ARTICULOS SET TITULO='" + pelicula.getTitulo() + "', "
                    + "GENERO='" + pelicula.getGenero() + "', ANO=" + pelicula.getAno() + ", CLASIFICACION=" + pelicula.getClasificacionEdad() + ", "
                    + "DURACION=" + pelicula.getDuracion() + ", FORMATO='" + pelicula.getFormato() + "', INTERPRETES='" + pelicula.getInterpretes() + "', "
                    + "NACIONALIDAD='" + pelicula.getNacionalidad() + "', FECHA_ALTA='" + stringFechaAlta + "', TARIFA_ID=" + stringTarifa + ", "
                    + "PROVEEDOR_ID=" + stringProveedor + ", V_ALQUILADA=" + pelicula.getVecesAlquilada() + ", FECHA_BAJA=" + stringFechaBaja + ", "
                    + "DISPONIBLE=" + disponible + ", ACTIVO=" + activo + " WHERE ID=" + pelicula.getId());

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                conexion.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }

    }

    /**
     * Obtiene de la base de datos una lista de películas que son las más alquiladas
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorMasAlquiladosBD(int cantidad) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 ORDER BY V_ALQUILADA DESC LIMIT "+cantidad;
        listPelicula = seleccionarBD(sql);
        return listPelicula;
    }

    /**
     * Obtiene de la base de datos una lista de películas que son las menos alquiladas
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorMenosAlquiladosBD(int cantidad) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 ORDER BY V_ALQUILADA LIMIT "+cantidad;
        listPelicula = seleccionarBD(sql);
        return listPelicula;
    }

    /**
     * Obtiene de la base de datos la película cuyo código es el seleccionado
     * @return Pelicula
     */
    public static Pelicula seleccionarPorCodigoBD(int codigo, boolean soloDisponible) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 AND ID =" + codigo;
        if (soloDisponible == true) {
         sql += " AND DISPONIBLE = 1";
        }
        listPelicula = seleccionarBD(sql);
        if(listPelicula.isEmpty()){
            return null;
        }
        return listPelicula.get(0);
    }

    /**
     * Obtiene de la base de datos una lista de películas cuyo titulo coincide con ciertas palabras
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorTituloBD(String titulo, boolean soloDisponible) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 AND TITULO LIKE '%" + titulo + "%'";
        if (soloDisponible == true) {
         sql += " AND DISPONIBLE = 1";
        }
        listPelicula = seleccionarBD(sql);
        return listPelicula;
    }

    /**
     * Obtiene de la base de datos una lista de peliculas que pertenecen a cierto género
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorGeneroBD(String genero, boolean soloDisponible) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 AND GENERO LIKE '%" + genero + "%'";
        if (soloDisponible == true) {
         sql += " AND DISPONIBLE = 1";
        }
        listPelicula = seleccionarBD(sql);
        return listPelicula;
    }

    /**
     * Obtiene de la base de datos una lista de películas que se lanzaron en cierto año
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorAnoBD(String ano, boolean soloDisponible) {
        List<Pelicula> listPelicula = new ArrayList();
        String sql = "SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, PROVEEDOR_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM ARTICULOS WHERE ISPELICULA = 1 AND ANO = " + ano;
        if (soloDisponible == true) {
         sql += " AND DISPONIBLE = 1";
        }
        listPelicula = seleccionarBD(sql);
        return listPelicula;
    }
   
    public static List<Pelicula> seleccionarBD(String sql) {
        //Lista de peliculas que devolveremos
        List<Pelicula> listPelicula = new ArrayList();

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Pelicula pelicula = null;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {

                pelicula = new Pelicula();

                pelicula.setId(resultSet.getInt("id"));
                pelicula.setTitulo(resultSet.getString("titulo"));
                pelicula.setGenero(resultSet.getString("genero"));
                pelicula.setAno(resultSet.getInt("ano"));
                pelicula.setClasificacionEdad(resultSet.getInt("clasificacion"));
                pelicula.setDuracion(resultSet.getInt("duracion"));
                pelicula.setFormato(resultSet.getString("formato"));
                pelicula.setInterpretes(resultSet.getString("interpretes"));
                pelicula.setNacionalidad(resultSet.getString("nacionalidad"));
                pelicula.setFechaAlta(dateFormat.parse(resultSet.getString("fecha_alta")));
                if (resultSet.getString("fecha_baja") == null) {
                    pelicula.setFechaBaja(null);
                } else {
                    pelicula.setFechaBaja(dateFormat.parse(resultSet.getString("fecha_baja")));
                }
                pelicula.setVecesAlquilada(resultSet.getInt("v_alquilada"));

                // LLamamos a la clase de persistencia de PTarifa y PProveedor.
                pelicula.setTarifa(PTarifa.seleccionarPorIdBD(resultSet.getInt("tarifa_id")));
                int idProveedor = resultSet.getInt("proveedor_id");
                if (idProveedor != -1) {
                    pelicula.setProveedor(PProveedor.seleccionarPorIdBD(idProveedor));
                } else {
                    pelicula.setProveedor(null);
                }

                //Los siguientes campos son boolean
                if (resultSet.getInt("disponible") == 1) {
                    pelicula.setDisponible(true);
                } else {
                    pelicula.setDisponible(false);
                }

                if (resultSet.getInt("activo") == 1) {
                    pelicula.setActivo(true);
                } else {
                    pelicula.setActivo(false);
                }

                //Pelicula construida y la añadimos a la lista
                listPelicula.add(pelicula);

            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listPelicula;

    }
    
}
